# 基于接口文档以及gpt自动mock数据
# 背景
之前部门已经搭建了接口文档,php根据portal简单编写代码,即可自动生成接口文档。
js再通过yapi-to-typescript可生成请求函数以及ts类型。
但是每次都要自己手写mock数据,影响开发效率,于是决定将openai融入接口文档脚本中,自动根据接口类型生成mock数据。
# 使用
# 安装
先把生成ts及mock的包装上
pnpm i @uedc/yapi-to-typescript
注意,这里换了包名了,已经基于原包yapi-to-typescript进行了二次开发,支持mock数据。
在package.json中添加命令
"ytt": "ytt"
# 配置
在项目根目录编写ytt.config.ts配置
import { defineConfig } from '@uedc/yapi-to-typescript';
export default defineConfig([
  {
    serverUrl: 'http://200.200.190.55:40001',
    typesOnly: false,
    target: 'typescript',
    reactHooks: {
      enabled: false,
    },
    prodEnvName: 'production',
    // -----TODO 填写个人的信锐ai的token-----
    openaiKey: '',
    // 输出文件路径前缀,每个项目配好就不用动了
    outputFilePathPrefix: 'src/apis',
    // 输出 Mock 文件路径前缀,每个项目配好就不用动了
    outputMockFilePathPrefix: 'mock/api',
    // 结果类型文件路径,使用根目录的绝对路径,
    resultTypeWrapperPath: '@/utils/axios/types',
    requestFunctionFilePath: 'src/apis/request.ts',
    dataKey: 'data',
    // -----TODO 每次调用需修改为自己业务的路径,类型文件和mock文件都会用自己的前缀+这个路径组成输出路径-----
    outputFilePathPostfix: 'test/index.ts',
    projects: [
      {
        // -----TODO 每次调用需修改为自己业务的token-----
        token: 'ddbf2175c522d45f2c85407d84e240a6639ca800a5c089dfffd30912588da6c9',
        categories: [
          {
            // -----TODO 每次调用需修改为自己业务的分类id-----
            id: 67,
            getRequestFunctionName(interfaceInfo, changeCase) {
              // 以接口全路径生成请求函数名
              return changeCase.camelCase(interfaceInfo.path);
              // 若生成的请求函数名存在语法关键词报错、或想通过某个关键词触发 IDE 自动引入提示,可考虑加前缀,如:
              // return changeCase.camelCase(`api_${interfaceInfo.path}`)
              // 若生成的请求函数名有重复报错,可考虑将接口请求方式纳入生成条件,如:
              // return changeCase.camelCase(`${interfaceInfo.method}_${interfaceInfo.path}`)
            },
          },
        ],
      },
    ],
  },
]);
这里主要是加了mock文件的生成路径,以及需填写个人的信锐ai的token。
# 生成
配置好项目id后,控制台npm run ytt即可
# mock
# 介绍
只要配置了mock文件路径outputMockFilePathPrefix,就会进行mock。
注意,使用的是openai去生成mock,需要在配置中填写个人的信锐ai的token。
另外,ai生成存在不稳定性,如果不符合预期可再跑一遍。
# 差量更新
由于生成的不一定是想要的文案或者格式,存在用户手动修改mock数据的场景。
针对此场景,本插件支持差量更新,在保持原数据的基础上,根据最新的接口文档进行更新。
# mock原理
其实使用openai进行mock的原理很简单
安装openai的包,然后编写propmt(需要反复编写以达到要求)
import OpenAI from 'openai'
const chatCompletion = await openai.chat.completions.create({
    model: 'gpt-3.5-turbo',
    temperature: 0,
    messages: [
      {
        role: 'user',
        content: `
          prompt描述
          以下是接口文档的返回类型定义:
          ${tsType}
          以下是之前mock的数据:
          ${oldMockData}
        `,
      },
    ],
  })
再将openai的回答写入指定的mock文件目录即可。
生成效果:
附带上了ts类型,方便调试。
import { Result } from '~/types';
import {
  IndexPhpEventEnvironmentalQualityGetRunstatDataEventApListResponse,
} from '../../apis/test/index';
export default [
    {
    url: '/index.php/event_environmental_quality/get_runstat_data/event_ap_list',
    method: 'post',
    response: (): Result<IndexPhpEventEnvironmentalQualityGetRunstatDataEventApListResponse> => {
      return {
        success: true,
        data: {
          device_list: {
            data: [
              {
                id: 1,
                ip: '192.168.1.1',
                dev_name: '设备名称',
                user_num: 1,
                normal_serv_cnt: 1,
                abnormal_serv_cnt: 1,
                serv_cnt: 1,
                rf_type: {
                  '1': '射频类型',
                },
              },
            ],
            total: 1,
          },
        },
      };
    },
  },
];
# 总结
通过openai自动生成mock数据,提升了编码效率,使开发人员可以更关注业务,细枝末节都通过自动化去解决。